package com.ideaaedi.zoo.example.springboot.openfeign.feignclient;

import com.ideaaedi.zoo.example.springboot.openfeign.config.SimpleFeignClientConfig;
import com.ideaaedi.zoo.example.springboot.openfeign.controller.DemoController;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 直接使用FeignClient
 * <pre>
 * 情况1：如果你使用了服务发现机制，那么只需要指定目标的服务name即可， url可不指定
 *
 * 情况2：如果你没有使用服务发现机制，需要指定某个据地的url,那么可以通过url进行指定。 但是注意，name也是必须要指定的。
 *
 *  注：url、name这些值，可以使用占位符，从环境变量中取， 如： @FeignClient(name = "${feign-demo1.name}",  url = "${feign-demo1.url}")
 * </pre>
 */
@FeignClient(url = "http://localhost:8080", name = "target-micro-service-name", configuration = SimpleFeignClientConfig.class)
@RequestMapping("/demo")
public interface Demo1FeignRpc {
    
    /**
     * 发送http请求，调用{@link DemoController#welcome()}
     */
    @GetMapping("/welcome")
    String welcome();
    
    /**
     * 发送http请求，调用{@link DemoController#addData(int, String)}
     */
    @PostMapping("/add-data")
    Map<Integer, String> addData(@RequestParam int id, @RequestParam String data);
    
    /**
     * 发送http请求，调用{@link DemoController#addDataJson(DemoController.DataRequest)}
     */
    @PostMapping("/add-data-json")
    List<DemoController.DataRequest> addDataJson(@RequestBody DemoController.DataRequest request);
    
    /**
     * 发送http请求，调用{@link DemoController#deleteData(int)}
     */
    @DeleteMapping("/delete-data/{id}")
    Map<Integer, String> deleteData(@PathVariable int id);
    
    /**
     * 发送http请求，调用{@link DemoController#getData(int)}
     */
    @GetMapping("/get-data/{id}")
    String getData(@PathVariable int id);
    
    /**
     * 发送http请求，调用{@link DemoController#updateData(int, String)}
     */
    @PutMapping("/update-data/{id}")
    Map<Integer, String> updateData(@PathVariable int id, @RequestParam String newData);
    
    /**
     * 发送http请求，调用{@link DemoController#getHeaders(Map)}
     */
    @GetMapping("/headers")
    Map<String, String> getHeaders();
}
